
//https://www.cnblogs.com/pssp/p/5216085.html
/**
 *首先必须要说的是，this的指向在函数定义的时候是确定不了的，只有函数执行的时候才能确定this到底指向谁，实际上this的最终指向的是那个调用它的对象
 *
 * 情况1：如果一个函数中有this，但是它没有被上一级的对象所调用，那么this指向的就是window，这里需要说明的是在js的严格版中this指向的不是window，但是我们这里不探讨严格版的问题，你想了解可以自行上网查找。

 　　情况2：如果一个函数中有this，这个函数有被上一级的对象所调用，那么this指向的就是上一级的对象。

 　　情况3：如果一个函数中有this，这个函数中包含多个对象，尽管这个函数是被最外层的对象所调用，this指向的也只是它上一级的对象
 情况4：当this碰到return时
 如果返回值是一个对象，那么this指向的就是那个返回的对象，如果返回值不是一个对象那么this还是指向函数的实例。
 还有一点就是虽然null也是对象，但是在这里this还是指向那个函数的实例，因为null比较特殊。
 情况5：　1.在严格版中的默认的this不再是window，而是undefined。
 new操作符会改变函数this的指向 首先new关键字会创建一个空的对象，然后会自动调用一个函数apply方法，将this指向这个空对象，这样的话函数内部的this就会被这个空的对象替代。
 在vuek上，普通函数指向vue的实例，箭头函数指向window
 */
function a(){
    var user = "追梦子";
    console.log(this.user); //undefined
    console.log(this); //Window
}
//a();

function b(){
    var user = "追梦子";
    console.log(this.user); //undefined
    console.log(this);　　//Window
}
// window.a();
var o = {
    user:"追梦子",
    fn:function(){
        console.log(this.user);  //追梦子
    }
}
// o.fn();

var o = {
    user:"追梦子",
    fn:function(){
        console.log(this.user); //追梦子
    }
}
// window.o.fn();

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //12
        }
    }
}
// o.b.fn();

var o = {
    a:10,
    b:{
        // a:12,
        fn:function(){
            console.log(this.a); //undefined
        }
    }
}
// o.b.fn();

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //undefined
            console.log(this); //window
        }
    }
}
var j = o.b.fn;
// j();

function Fn(){
    this.user = "追梦子";
}
var a = new Fn();
// console.log(a.user); //追梦子

function fn()
{
    this.user = '追梦子';
    return {};
}
var a = new fn;
// console.log(a.user); //undefined

function fn()
{
    this.user = '追梦子';
    return function(){};
}
var a = new fn;
// console.log(a.user); //undefined

function fn()
{
    this.user = '追梦子';
    return 1;
}
var a = new fn;
// console.log(a.user); //追梦子

function fn()
{
    this.user = '追梦子';
    return 1;
}
var a = new fn;
// console.log(a.user); //追梦子

function fn()
{
    this.user = '追梦子';
    return undefined;
}
var a = new fn;
// console.log(a); //fn {user: "追梦子"}

function fn()
{
    this.user = '追梦子';
    return null;
}
var a = new fn;
// console.log(a.user); //追梦子

function fn(){
    this.num = 1;
}
var a = new fn();
console.log(a.num); //1